/* 中间代码生成器 辅助语法分析 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "common.h"

int insptr;                    // 指令指针
char instr[fctnum][4];         // 指令集
instruction code[512];         // 指令列表

// 初始化
void code_init()
{
    // 设置指令名称
    strcpy(&(instr[lit][0]), "lit");
	strcpy(&(instr[opr][0]), "opr");
	strcpy(&(instr[lod][0]), "lod");
	strcpy(&(instr[sto][0]), "sto");
	strcpy(&(instr[cal][0]), "cal");
	strcpy(&(instr[ini][0]), "int");
	strcpy(&(instr[jmp][0]), "jmp");
	strcpy(&(instr[jpc][0]), "jpc");
    
    // 指令指针置0
    insptr = 0;
}

// 生成一条pcode指令
void code_gen(object op, int level, int value)
{
    code[insptr].op    = op;
    code[insptr].level = level;
    code[insptr].value = value;
    insptr++;
}

// 读取第p条pcode指令
instruction code_read(int p)
{
    return code[p];
}

// 输出从begin开始的pcode列表
void code_list(int begin)
{
    for(int i = begin; i < insptr; i++) {
        printf("%2d %s %d %2d\n",
            i, instr[code[i].op], code[i].level, code[i].value);
    }
}